// 设置BASE_URL,请求仅拼接后缀即可
import axios from 'axios'
import cache from '@/cache/index'
import {errMsg} from '@/common/system/constant'
import {Message} from 'element-ui'
// import utils from '@/common/utils.js'
import {hasToken} from '@/permission/permission'

const SUCCESS = 'success'
const WARN = 'warn'


export const commonInstance = axios.create({});

commonInstance.defaults.baseURL = process.env.BASE_URL;

// 请求前拦截器
commonInstance.interceptors.request.use((config) => {
  if (document.querySelector('#app-main')) {
    // NProgress.start()
  }
  // let data = config.data
  // 请求中的params数组统一转为字符串,请求体暂不管控
  let params = config.params
  if (params instanceof Object) {
    Object.keys(params).forEach(key => {
      if (params[key] instanceof Array) {
        params[key] = params[key].toString()
      }
    })
  }
  let token = cache.getToken()
  // isToken 用于判断接口是否需要传token,如果不为false,那么认为需要传token
  const isToken = (config.headers || {}).isToken === false
  // 如果需要token且存在token
  if (!isToken && token) {
    config.headers.Authorization = "Bearer " + token;
    // 如果需要token(但token不存在),那么取消发送
  } else if (!isToken) {
    // 这里如果返回一个error的话,会在业务中捕获,反之则不会被捕获.如果没有token,那么应该统一在过滤器处处理,因此这里不抛出error
    utils.logout()
    return Promise.reject('当前用户登陆信息不存在')
  }
  return config;
});
// 返回拦截器
commonInstance.interceptors.response.use(function (response) {
  if (hasToken()) {
    // NProgress.done()
  }
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  let {data} = response
  // 如果是常规的请求,一方面需要判断其是否请求成功,另一方面仅返回相应的数据即可
  if (response.headers && response.headers.getContentType() && ~response.headers.getContentType().indexOf('application/json')) {
    if (isSuccess(response)) {
      // 不做处理
      return Promise.resolve(data)
    } else {
      let message = data.detail || errMsg
      Message.warning(message);
      console.error('错误信息:', data)
      return Promise.reject(data)
    }
  }else{
    // 返回整个响应体
    return response
  }
}, function (error) {
  if (hasToken()) {
    // NProgress.done()
  }
  // 超出 2xx 范围的状态码都会触发该函数
  // 对响应错误做点什么
  catchErr(error)
  return Promise.reject(error);
});

// 请求错误处理
function catchErr(error) {
  let msg = errMsg
  if (error.response) {
    let status = error.response.status
    switch (status) {
      case 401:
        msg = '当前用户登陆信息已失效'
        utils.logout(`${msg},确定退出登陆?`)
        break
      case 403:
        msg='权限不足'
      case 503:
        msg = '服务不存在'
        break
      case 404:
        msg = '资源不存在'
        break
      case 500:
        msg = '服务器异常'
        break
    }
    // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
    console.error('请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围')
  } else if (error.request) {
    // 请求已经成功发起，但没有收到响应
    // `error.request` 在浏览器中是 XMLHttpRequest 的实例，
    // 而在node.js中是 http.ClientRequest 的实例
    console.error('请求已经成功发起，但没有收到响应')
    // console.log(error.request);
  } else {
    // 发送请求时出了点问题,可能是被拦截器拦截
    console.error('发送请求时出了点问题')
    // 拦截器返回的error是字符串
    msg = typeof error === 'string' ? error : msg
  }
  Message.error(msg)
}


// 获取返回的状态结果
function getResult(response) {
  return response.data.result
}

// 判断请求是否成功
function isSuccess(response) {
  // 如果是常规的请求,那么对返回格式进行判断
  if (response && response.data && (getResult(response) === SUCCESS || getResult(response) === WARN) ) {
    return true
  } else {
    return false
  }
}


